// bannerColorExtractor.js

/**
 * Banner图片主色调提取工具
 * 使用说明：
 * 1. 导入模块：const colorExtractor = require('./bannerColorExtractor');
 * 2. 调用方法：colorExtractor.getBannerColors(imageUrlArray, callback);
 */

const { request } = require('./request.js');
const api = require('./api.js');

module.exports = {
  /**
   * 获取Banner列表并提取主色调
   * @param {Function} callback - 处理完成后的回调函数
   */
  getBanners: function(callback) {
    request(api.banners, 'GET')
      .then(res => {
        callback(res.data.list);
      })
      .catch(err => {
        console.log('获取Banner失败', err);
        callback(res.data.list);
      });
  },

  /**
   * 预加载Banner颜色
   * @param {Array} images - 图片数组
   * @param {Function} callback - 处理完成后的回调函数
   */
  preloadBannerColors: function(images, callback) {
    const promises = images.map(item => {
      return new Promise((resolve) => {
        this.getImageMainColor(item.imageUrl, (hex) => {
          item.hex = hex;
          resolve(item);
        });
      });
    });

    Promise.all(promises)
      .then(processedImages => {
        callback(processedImages, null);
      })
      .catch(err => {
        callback(images, err);
      });
  },

  /**
   * 获取图片主色调
   * @param {String} url - 图片URL
   * @param {Function} callback - 回调函数，返回HEX颜色值
   */
  getImageMainColor: function(url, callback) {
    wx.downloadFile({
      url: url,
      success: res => {
        if (res.statusCode === 200) {
          this.drawImageToCanvas(res.tempFilePath, callback);
        } else {
          console.log('downloadFile状态码错误', res.statusCode);
          callback(null); // 默认返回白色
        }
      },
      fail: err => {
        console.error('downloadFile失败', err);
        callback(null); // 默认返回白色
      }
    });
  },

  /**
   * 将图片绘制到Canvas并提取颜色
   * @param {String} path - 图片临时路径
   * @param {Function} callback - 回调函数
   */
  drawImageToCanvas: function(path, callback) {
    const ctx = wx.createCanvasContext('colorCanvas');
    ctx.clearRect(0, 0, 10, 10);
    ctx.drawImage(path, 0, 0, 10, 10);
    ctx.draw(true, () => {
      wx.canvasGetImageData({
        canvasId: 'colorCanvas',
        x: 0,
        y: 0,
        width: 10,
        height: 10,
        success: res => {
          const rgb = this.calculateAverageRGB(res.data);
          const hex = this.rgbToHex(rgb.r, rgb.g, rgb.b);
          callback(hex);
        },
        fail: err => {
          console.error('获取canvas像素失败', err);
          callback(null); // 默认返回白色
        }
      });
    });
  },

  /**
   * 计算平均RGB值
   * @param {Uint8ClampedArray} data - 图像数据
   * @returns {Object} 包含r,g,b属性的对象
   */
  calculateAverageRGB: function(data) {
    let r = 0, g = 0, b = 0;
    const len = data.length / 4;
    for (let i = 0; i < data.length; i += 4) {
      r += data[i];
      g += data[i + 1];
      b += data[i + 2];
    }
    return {
      r: Math.round(r / len),
      g: Math.round(g / len),
      b: Math.round(b / len)
    };
  },

  /**
   * RGB转HEX
   * @param {Number} r - 红色值(0-255)
   * @param {Number} g - 绿色值(0-255)
   * @param {Number} b - 蓝色值(0-255)
   * @returns {String} HEX颜色字符串
   */
  rgbToHex: function(r, g, b) {
    return '#' + [r, g, b].map(x => {
      const hex = x.toString(16);
      return hex.length === 1 ? '0' + hex : hex;
    }).join('');
  }
};